#ifndef COPY_POLICY_H
#define COPY_POLICY_H

namespace cytoolkit {

class NonCopyable {
public:
    NonCopyable(const NonCopyable&) = delete;
    NonCopyable& operator=(const NonCopyable&) = delete;

protected:
    NonCopyable() = default;
    ~NonCopyable() = default;
};
// 禁止移动（允许拷贝）
class NonMovable {
protected:
    NonMovable() = default;
    ~NonMovable() = default;

    // 允许拷贝（默认生成）
    NonMovable(const NonMovable&) = default;
    NonMovable& operator=(const NonMovable&) = default;

    // 禁止移动构造和移动赋值
    NonMovable(NonMovable&&) = delete;
    NonMovable& operator=(NonMovable&&) = delete;
};

// 既禁止拷贝也禁止移动
class NonCopyableMovable {
protected:
    NonCopyableMovable() = default;
    ~NonCopyableMovable() = default;

    NonCopyableMovable(const NonCopyableMovable&) = delete;
    NonCopyableMovable& operator=(const NonCopyableMovable&) = delete;
    NonCopyableMovable(NonCopyableMovable&&) = delete;
    NonCopyableMovable& operator=(NonCopyableMovable&&) = delete;
};

}  // namespace cytoolkit

#endif  // COPY_POLICY_H